//
//  MenuScene.cpp
//  SimpleGame
//
//  Created by Scar1et on 2017/7/26.
//
//

// 头文件 -- 类库声明请放入头文件
#include "MenuScene.h"

// 层级：影响显示与事件响应
enum {
    // 背景
    levelBGSimple = 1,
    // 内容
    levelContentSimple = 101,
    // 对话框
    levelDialogSimple = 1001
};

// TAG：视图标记
enum {
    tagBack = 1,
    tagPlayS = 2,
    tagPlayI = 3,
    tagToggle = 4
};

// 创建场景
Scene* MenuScene::createScene() {
    Scene* sMenu = Scene::create();
    sMenu->addChild(MenuScene::create());
    return sMenu;
}

// 初始化场景，自动调用
bool MenuScene::init() {
    // 先调用父类Init
    if (!Layer::init()) {
        return false;
    }
    
    // 手机按键监听器
    listenerKeyboard = EventListenerKeyboard::create();
    listenerKeyboard->onKeyReleased = CC_CALLBACK_2(MenuScene::onKeyReleased, this);
    // 添加到事件分发器中
    Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listenerKeyboard, this);
    
    // 开始初始化
    // 成员变量初始化
    // 可视区域尺寸
    sizeVisible = Director::getInstance()->getVisibleSize();
    // 可视区域的出发点坐标
    positionOrigin = Director::getInstance()->getVisibleOrigin();
    // 屏幕尺寸
    sizeWin = Director::getInstance()->getWinSize();
    
    this->initContent();
    
    // 初始化成功
    return true;
}

// 内容初始化
void MenuScene::initContent() {
    // MenuItemLabel 例子
    // 可创建一个Label，放入MenuItemLabel，构成一个按钮
    // 支持所有形态的Label
    // CC_CALLBACK_N(回调方法，容器)：点击回调宏【N：表示回调方法参数个数】
    auto lBack = Label::createWithSystemFont("返回", "arial.ttf", 28);
    lBack->setTextColor(Color4B::WHITE);
    lBack->setHorizontalAlignment(TextHAlignment::LEFT);
    lBack->setVerticalAlignment(TextVAlignment::CENTER);
    lBack->setDimensions(120, 40);
    auto milBack = MenuItemLabel::create(lBack, CC_CALLBACK_1(MenuScene::onClicked, this));
    milBack->setTag(tagBack);
    milBack->setPosition(Vec2(positionOrigin.x + 80, positionOrigin.y + sizeVisible.height - 40));
    
    // MenuItemSprite 例子
    // 最多可设置三个、至少设置两个精灵对象，分别表示按钮的三个状态：正常、选中、禁用
    // 支持所有形态的Sprite【ui::Scale9Sprite用于缩放】
    // CC_CALLBACK_N(回调方法，容器)：点击回调宏【N：表示回调方法参数个数】
    auto sPlayNormal = Sprite::create("btn_play_normal.png");
    auto sPlaySelected = Sprite::create("btn_play_selected.png");
    auto misPlay = MenuItemSprite::create(sPlayNormal, sPlaySelected, CC_CALLBACK_1(MenuScene::onClicked, this));
    misPlay->setTag(tagPlayS);
    misPlay->setPosition(Vec2(positionOrigin.x + sizeVisible.width / 2, positionOrigin.y + sizeVisible.height - 140));
    
    // MenuItemImage 例子
    // 最多可设置三个、至少设置两个精灵对象，分别表示按钮的三个状态：正常、选中、禁用
    // CC_CALLBACK_N(回调方法，容器)：点击回调宏【N：表示回调方法参数个数】
    auto miiPlay = MenuItemImage::create("btn_play_normal.png", "btn_play_selected.png", CC_CALLBACK_1(MenuScene::onClicked, this));
    miiPlay->setTag(tagPlayI);
    miiPlay->setPosition(Vec2(positionOrigin.x + sizeVisible.width / 2, positionOrigin.y + sizeVisible.height - 280));
    
    // MenuItemToggle 例子
    // 可设置状态Item：使用MenuItem
    // 初始化需要两个状态，如：mifNormal、mifSelected
    // 可使用“addSubItem”加入新增多个状态，如：miiToggleSubItem
    // CC_CALLBACK_N(回调方法，容器)：点击回调宏【N：表示回调方法参数个数】
    auto mifNormal = MenuItemFont::create("Toggle_Normal");
    auto mifSelected = MenuItemFont::create("Toggle_Selected");
    auto mitToggle = MenuItemToggle::createWithCallback(CC_CALLBACK_1(MenuScene::onClicked, this), mifNormal, mifSelected, NULL);
    mitToggle->setTag(tagToggle);
    mitToggle->setPosition(Vec2(positionOrigin.x + sizeVisible.width/ 2, positionOrigin.y + sizeVisible.height - 500));
    auto miiToggleSubItem = MenuItemImage::create("btn_play_normal.png", "btn_play_selected.png");
    mitToggle->addSubItem(miiToggleSubItem);
    mitToggle->addSubItem(miiToggleSubItem);
    mitToggle->addSubItem(miiToggleSubItem);
    
    // 按钮菜单 -- Menu【可添加多个，用NULL结尾】
    auto mMenu = Menu::create(milBack, misPlay, miiPlay, mitToggle, NULL);
    mMenu->setPosition(Vec2::ZERO);
    this->addChild(mMenu, levelContentSimple);
}

// 返回功能
void MenuScene::back() {
    // 从事件分发器移除手机按键监听器
    Director::getInstance()->getEventDispatcher()->removeEventListener(listenerKeyboard);
    // 从场景堆栈中pop出一个场景，替换现在正运行的场景，而运行中的场景将被删除
    Director::getInstance()->popScene();
}

// 点击监听
void MenuScene::onClicked(Ref* rSender) {
    int tag = ((MenuItem*)rSender)->getTag();
    switch (tag) {
        case tagBack:
            // 返回按钮被点击
            this->back();
            break;
        case tagPlayS:
            // PlayS按钮被点击
            log("tagPlayS");
            break;
        case tagPlayI:
            // PlayI按钮被点击
            log("tagPlayI");
            break;
        case tagToggle: {
            // Toggle按钮被点击
            // 若不使用大括号括住mitTemp的话，mitTemp是所有分支都是可以访问的，但是如果不进入tagToggle分支的话，mitTemp又是不会初始化的
            // 所以需要在外部声明或者把内部括起来
            auto mitTemp = (MenuItemToggle*)rSender;
            switch(mitTemp->getSelectedIndex()) {
                case 0:
                    // 正常
                    log("tagToggle - %s", "normal");
                    break;
                case 1:
                    // 选中
                    log("tagToggle - %s", "selected");
                    break;
                case 2:
                    // 自定义状态 1
                    log("tagToggle - %s", "自定义状态 1");
                    break;
                case 3:
                    // 自定义状态 2
                    log("tagToggle - %s", "自定义状态 2");
                    break;
                default:
                    // 其他自定义状态
                    log("tagToggle - %s", "其他自定义状态");
                    break;
            }
        }
            break;
        default:
            break;
    }
}

// 键盘点击监听
void MenuScene::onKeyReleased(EventKeyboard::KeyCode keyCode, Event* event) {
    switch (keyCode){
        case EventKeyboard::KeyCode::KEY_BACK:
            // 返回键
            this->back();
            break;
        default:
            break;
    }
}
